local cjson = require("cjson")

ngx.req.read_body()  -- 读取请求体 需要显示的调用

-- ngx.header.content_length = nil  --暂时不用设置，后续有问题再考虑

-- 获取POST参数,注意这种方式获取post参数会有问题
-- 在处理HTTP POST请求时，如果遇到ngx.req.get_post_args()解析参数不正确的问题，这通常与请求的Content-Type头部或请求体的格式有关。根据你提供的信息，这里有几个可能的原因和相应的解决方案：

-- 1. Content-Type问题
-- 确保客户端发送请求时Content-Type头部正确设置为application/x-www-form-urlencoded或multipart/form-data（取决于你的具体情况）。如果Content-Type设置错误，OpenResty可能无法正确解析POST参数。

-- 2. 特殊字符编码
-- 看起来密码字段包含了许多特殊字符，这些特殊字符（如+, &, %等）在URL编码中有特殊含义。确保发送请求之前，客户端正确地对所有特殊字符进行了URL编码。例如，+字符应该被编码为%2B。

-- 3. 请求体格式
-- 如果你是以JSON格式发送数据（通常Content-Type头部为application/json），则ngx.req.get_post_args()可能不会如预期工作，因为它主要用于处理application/x-www-form-urlencoded和multipart/form-data类型的数据。对于JSON，你可能需要使用ngx.req.get_body_data()来获取原始请求体，然后手动解析JSON：

-- local argss, err = ngx.req.get_post_args()

local function print_args(args)
    if not args then
        -- 如果出错，记录错误信息
        ngx.log(ngx.ERR, "获取POST参数出错: ", err)
        return
    end
    
    -- 将参数转换为字符串
    local args_str = ""
    for key, val in pairs(args) do
        -- 注意：val可能是一个数组，如果POST参数中有多个相同的键
        -- if type(val) == "table" then
        --     val = table.concat(val, ", ")
        -- end
        ngx.log(ngx.ERR, "key ", key)
        ngx.log(ngx.ERR, "val ", val)
        args_str = args_str .. key .. "=" .. val .. "&"
    end
    
    -- 移除最后一个多余的"&"
    args_str = args_str:sub(1, -2)
    
    -- 记录到日志
    ngx.log(ngx.ERR, "POST参数: ", args_str)
end

-- print_args(argss)


-- 此处使用使用ngx.req.get_body_data()来获取原始请求体，然后手动解析JSON
local body = ngx.req.get_body_data()
if body then
    local params = cjson.decode(body)
    -- 现在可以使用params["username"], params["password"]等访问你的数据
    local user_name = params["username"] or params["userName"] 
    ngx.log(ngx.ERR, "用户名： ", user_name)
    if user_name then

        local shared_data = ngx.shared.user_data
        local appid = ngx.var.app_id
        -- 组合键：客户端IP地址和appid
        local key_arr = ngx.var.remote_addr .. "_" .. (appid or "default")

        local success, err, forcible = shared_data:set(key_arr, user_name)
        if success then
            ngx.log(ngx.ERR, "set name+AAAAAAAAAAAAAAAA ",key_arr .. user_name)
        else
            ngx.log(ngx.ERR, "error setting uname ", err)
        end
    end

end




